import auth from "@/plugins/auth";
import router, { constantRoutes, dynamicRoutes } from "@/router";
import { getRouters } from "@/api/menu";
import Layout from "@/layout/index";
import ParentView from "@/components/ParentView";
import InnerLink from "@/layout/components/InnerLink";
// import { personManagement } from "../data";

const permission = {
  state: {
    routes: [],
    addRoutes: [],
    defaultRoutes: [],
    topbarRouters: [],
    sidebarRouters: [],
  },
  mutations: {
    SET_ROUTES: (state, routes) => {
      state.addRoutes = routes;
      state.routes = constantRoutes.concat(routes);
    },
    SET_DEFAULT_ROUTES: (state, routes) => {
      state.defaultRoutes = constantRoutes.concat(routes);
    },
    SET_TOPBAR_ROUTES: (state, routes) => {
      state.topbarRouters = routes;
    },
    SET_SIDEBAR_ROUTERS: (state, routes) => {
      state.sidebarRouters = routes;
    },
  },
  actions: {
    // 生成路由
    GenerateRoutes({ commit }) {
      return new Promise((resolve) => {
        // 向后端请求路由数据
        getRouters().then((res) => {
          // TODO
          // res.data.push({
          //   name: "DocumentManagement",
          //   path: "/documentManagement",
          //   hidden: false,
          //   redirect: "noRedirect",
          //   component: "Layout",
          //   alwaysShow: true,
          //   meta: {
          //     title: "全委通知",
          //     icon: "system",
          //     noCache: false,
          //     link: null,
          //   },
          //   children: [
          //     {
          //       name: "NoticeList",
          //       path: "noticeList",
          //       hidden: false,
          //       component: "documentManagement/commonNotice/noticeList",
          //       meta: {
          //         title: "通知公告",
          //         icon: "user",
          //         noCache: false,
          //         link: null,
          //       },
          //     },
          //     {
          //       name: "Create",
          //       path: "create",
          //       hidden: false,
          //       component: "documentManagement/commonNotice/create",
          //       meta: {
          //         title: "我创建的",
          //         icon: "user",
          //         noCache: false,
          //         link: null,
          //       },
          //     },
          //   ],
          // });

          // res.data.push({
          //   name: "DocumentManagement",
          //   path: "/documentManagement",
          //   hidden: false,
          //   redirect: "noRedirect",
          //   component: "Layout",
          //   alwaysShow: true,
          //   meta: {
          //     title: "公文管理",
          //     icon: "system",
          //     noCache: false,
          //     link: null,
          //   },
          //   children: [
          //     {
          //       name: "allNotice",
          //       path: "allNotice",
          //       hidden: false,
          //       component: "ParentView",
          //       meta: {
          //         title: "全委通知",
          //         icon: null,
          //         noCache: false,
          //         link: null,
          //       },
          //       children: [
          //         {
          //           name: "noticeList",
          //           path: "notice-List",
          //           hidden: false,
          //           component: "allNotice/notice/index.vue",
          //           meta: {
          //             title: "通知公告",
          //             icon: "user",
          //             noCache: false,
          //             link: null,
          //           },
          //         },
          //         {
          //           name: "MyAllNotice",
          //           path: "my-all-notice",
          //           hidden: false,
          //           component: "allNotice/my/index.vue",
          //           meta: {
          //             title: "我创建的",
          //             icon: "user",
          //             noCache: false,
          //             link: null,
          //           },
          //         },
          //         {
          //           name: "CompleteAllNotice",
          //           path: "complete-all-notice",
          //           hidden: false,
          //           component: "allNotice/complete/index.vue",
          //           meta: {
          //             title: "我审批的",
          //             icon: "user",
          //             noCache: false,
          //             link: null,
          //           },
          //         },
          //       ],
          //     },
          //     {
          //       name: "departmentNotice",
          //       path: "departmentNotice",
          //       hidden: false,
          //       component: "ParentView",
          //       meta: {
          //         title: "部门通知",
          //         icon: null,
          //         noCache: false,
          //         link: null,
          //       },
          //       children: [
          //         {
          //           name: "depNoticeList",
          //           path: "dep-notice-List",
          //           hidden: false,
          //           component: "departmentNotice/notice/index.vue",
          //           meta: {
          //             title: "通知公告",
          //             icon: "user",
          //             noCache: false,
          //             link: null,
          //           },
          //         },
          //         {
          //           name: "MyDepartmentNotice",
          //           path: "my-dep-notice",
          //           hidden: false,
          //           component: "departmentNotice/my/index.vue",
          //           meta: {
          //             title: "我创建的",
          //             icon: "user",
          //             noCache: false,
          //             link: null,
          //           },
          //         },
          //         {
          //           name: "CompleteDepNotice",
          //           path: "complete-dep-notice",
          //           hidden: false,
          //           component: "departmentNotice/complete/index.vue",
          //           meta: {
          //             title: "我审批的",
          //             icon: "user",
          //             noCache: false,
          //             link: null,
          //           },
          //         },
          //       ],
          //     },
          //     {
          //       name: "matter",
          //       path: "matter",
          //       hidden: false,
          //       component: "ParentView",
          //       meta: {
          //         title: "事项办理",
          //         icon: null,
          //         noCache: false,
          //         link: null,
          //       },
          //       children: [
          //         {
          //           name: "MyMatter",
          //           path: "my-matter",
          //           hidden: false,
          //           component: "handleMatter/my/index.vue",
          //           meta: {
          //             title: "我发起的",
          //             icon: "user",
          //             noCache: false,
          //             link: null,
          //           },
          //         },
          //         {
          //           name: "WaitMatter",
          //           path: "wait-matter",
          //           hidden: false,
          //           component: "handleMatter/wait/index.vue",
          //           meta: {
          //             title: "待处理的",
          //             icon: "user",
          //             noCache: false,
          //             link: null,
          //           },
          //         },
          //         {
          //           name: "CompleteMatter",
          //           path: "complete-matter",
          //           hidden: false,
          //           component: "handleMatter/complete/index.vue",
          //           meta: {
          //             title: "我已办的",
          //             icon: "user",
          //             noCache: false,
          //             link: null,
          //           },
          //         },
          //       ],
          //     },
          //     {
          //       name: "application",
          //       path: "application",
          //       hidden: false,
          //       component: "ParentView",
          //       meta: {
          //         title: "请假申请",
          //         icon: null,
          //         noCache: false,
          //         link: null,
          //       },
          //       children: [
          //         {
          //           name: "MyApplication",
          //           path: "my-application",
          //           hidden: false,
          //           component: "leaveApplication/my/index.vue",
          //           meta: {
          //             title: "我申请的",
          //             icon: "user",
          //             noCache: false,
          //             link: null,
          //           },
          //         },
          //         {
          //           name: "WaitApplication",
          //           path: "wait-application",
          //           hidden: false,
          //           component: "leaveApplication/wait/index.vue",
          //           meta: {
          //             title: "待处理的",
          //             icon: "user",
          //             noCache: false,
          //             link: null,
          //           },
          //         },
          //         {
          //           name: "CompleteApplication",
          //           path: "complete-application",
          //           hidden: false,
          //           component: "leaveApplication/complete/index.vue",
          //           meta: {
          //             title: "我已办的",
          //             icon: "user",
          //             noCache: false,
          //             link: null,
          //           },
          //         },
          //       ],
          //     },
          //   ],
          // });

          // res.data.push({
          //   name: "xzgl",
          //   path: "/xzgl",
          //   hidden: false,
          //   redirect: "noRedirect",
          //   component: "Layout",
          //   alwaysShow: true,
          //   meta: {
          //     title: "行政管理",
          //     icon: "system",
          //     noCache: false,
          //     link: null,
          //   },
          //   children: [
          //     {
          //       name: "hytz",
          //       path: "hytz",
          //       hidden: false,
          //       component: "ParentView",
          //       meta: {
          //         title: "会议通知",
          //         icon: null,
          //         noCache: false,
          //         link: null,
          //       },
          //       children: [
          //         {
          //           name: "attend",
          //           path: "attend",
          //           hidden: false,
          //           component: "xzgl/hytz/attend",
          //           meta: {
          //             title: "我参与的",
          //             icon: "user",
          //             noCache: false,
          //             link: null,
          //           },
          //         },
          //         {
          //           name: "create",
          //           path: "create",
          //           hidden: false,
          //           component: "xzgl/hytz/create",
          //           meta: {
          //             title: "我发起的",
          //             icon: "user",
          //             noCache: false,
          //             link: null,
          //           },
          //         },
          //         {
          //           name: "approve",
          //           path: "approve",
          //           hidden: false,
          //           component: "xzgl/hytz/approve",
          //           meta: {
          //             title: "我审批的",
          //             icon: "user",
          //             noCache: false,
          //             link: null,
          //           },
          //         },
          //       ],
          //     },
          //     {
          //       name: "hyyd",
          //       path: "hyyd",
          //       hidden: false,
          //       component: "ParentView",
          //       meta: {
          //         title: "会议预定",
          //         icon: null,
          //         noCache: false,
          //         link: null,
          //       },
          //       children: [
          //         {
          //           name: "roomApply",
          //           path: "roomApply",
          //           hidden: false,
          //           component: "xzgl/hyyd/roomApply",
          //           meta: {
          //             title: "会议室预定",
          //             icon: "user",
          //             noCache: false,
          //             link: null,
          //           },
          //         },
          //         {
          //           name: "myRoom",
          //           path: "myRoom",
          //           hidden: false,
          //           component: "xzgl/hyyd/myRoom",
          //           meta: {
          //             title: "我的会议室",
          //             icon: "user",
          //             noCache: false,
          //             link: null,
          //           },
          //         },
          //         {
          //           name: "myRoomDetail",
          //           path: "myRoomDetail",
          //           hidden: true,
          //           component: "xzgl/hyyd/myRoomDetail",
          //           meta: {
          //             title: "查看详情",
          //             noCache: true,
          //           },
          //         },
          //         {
          //           name: "applyRecord",
          //           path: "applyRecord",
          //           hidden: false,
          //           component: "xzgl/hyyd/applyRecord",
          //           meta: {
          //             title: "预定记录",
          //             icon: "user",
          //             noCache: false,
          //             link: null,
          //           },
          //         },
          //       ],
          //     },
          //     {
          //       name: "zygl",
          //       path: "zygl",
          //       hidden: false,
          //       component: "ParentView",
          //       meta: {
          //         title: "资源管理",
          //         icon: null,
          //         noCache: false,
          //         link: null,
          //       },
          //       children: [
          //         {
          //           name: "room",
          //           path: "room",
          //           hidden: false,
          //           component: "xzgl/zygl/room",
          //           meta: {
          //             title: "会议室管理",
          //             icon: "user",
          //             noCache: false,
          //             link: null,
          //           },
          //         },
          //         {
          //           name: "place",
          //           path: "place",
          //           hidden: false,
          //           component: "xzgl/zygl/place",
          //           meta: {
          //             title: "场地管理",
          //             icon: "user",
          //             noCache: false,
          //             link: null,
          //           },
          //         },
          //       ],
          //     },
          //   ],
          // });
          // res.data.push(personManagement);
          const sdata = JSON.parse(JSON.stringify(res.data));
          const rdata = JSON.parse(JSON.stringify(res.data));
          const sidebarRoutes = filterAsyncRouter(sdata);
          const rewriteRoutes = filterAsyncRouter(rdata, false, true);
          const asyncRoutes = filterDynamicRoutes(dynamicRoutes);
          rewriteRoutes.push({
            path: "*",
            redirect: "/404",
            hidden: true,
          });
          router.addRoutes(asyncRoutes);
          commit("SET_ROUTES", rewriteRoutes);
          commit("SET_SIDEBAR_ROUTERS", constantRoutes.concat(sidebarRoutes));
          commit("SET_DEFAULT_ROUTES", sidebarRoutes);
          commit("SET_TOPBAR_ROUTES", sidebarRoutes);
          resolve(rewriteRoutes);
        });
      });
    },
  },
};

// 遍历后台传来的路由字符串，转换为组件对象
function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {
  return asyncRouterMap.filter((route) => {
    if (type && route.children) {
      route.children = filterChildren(route.children);
    }
    if (route.component) {
      // Layout ParentView 组件特殊处理
      if (route.component === "Layout") {
        route.component = Layout;
      } else if (route.component === "ParentView") {
        route.component = ParentView;
      } else if (route.component === "InnerLink") {
        route.component = InnerLink;
      } else {
        route.component = loadView(route.component);
      }
    }
    if (route.children != null && route.children && route.children.length) {
      route.children = filterAsyncRouter(route.children, route, type);
    } else {
      delete route["children"];
      delete route["redirect"];
    }
    return true;
  });
}

function filterChildren(childrenMap, lastRouter = false) {
  var children = [];
  childrenMap.forEach((el, index) => {
    if (el.children && el.children.length) {
      if (el.component === "ParentView" && !lastRouter) {
        el.children.forEach((c) => {
          c.path = el.path + "/" + c.path;
          if (c.children && c.children.length) {
            children = children.concat(filterChildren(c.children, c));
            return;
          }
          children.push(c);
        });
        return;
      }
    }
    if (lastRouter) {
      el.path = lastRouter.path + "/" + el.path;
    }
    children = children.concat(el);
  });
  return children;
}

// 动态路由遍历，验证是否具备权限
export function filterDynamicRoutes(routes) {
  const res = [];
  routes.forEach((route) => {
    if (route.permissions) {
      if (auth.hasPermiOr(route.permissions)) {
        res.push(route);
      }
    } else if (route.roles) {
      if (auth.hasRoleOr(route.roles)) {
        res.push(route);
      }
    }
  });
  return res;
}

export const loadView = (view) => {
  if (process.env.NODE_ENV === "development") {
    return (resolve) => require([`@/views/${view}`], resolve);
  } else {
    // 使用 import 实现生产环境的路由懒加载
    return () => import(`@/views/${view}`);
  }
};

export default permission;
